package sfin.service;

import static org.apache.commons.lang.StringUtils.isBlank;
import static org.apache.commons.lang.StringUtils.isNumeric;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.ResourceBundle;

import sfin.swt.data.SimulacaoData;
import sfin.swt.exception.StatizoException;
import sfin.swt.util.FormatterUtil;
public class SimulacaoService extends AbstractService{

	private LancamentoService lancamentoService;
	private PeriodoService periodoService;

	public SimulacaoService(ResourceBundle bundle, FormatterUtil formatterUtil, LancamentoService lancamentoService, PeriodoService periodoService) {
		super(bundle, formatterUtil);
		this.lancamentoService = lancamentoService;
		this.periodoService = periodoService;
	}


	public List<SimulacaoData> calcularSimulacaoAnual(String valueStr, String qtd, int ano, int mes) throws StatizoException{

		List<String> errors = new ArrayList<String>();

		if(!isNumeric(qtd)){
			errors.add(bundle.getString("simulacao.qtd.error"));
		}

		if(!isNumeric(valueStr)){
			errors.add(bundle.getString("simulacao.value.error"));
		}

		if(errors.isEmpty()){

			List<SimulacaoData> simulacaoDataList = new ArrayList<SimulacaoData>(12);

			Calendar before = formatterUtil.getBefore(0, ano);			
			int mesAnterior = before.get(Calendar.MONTH);
			int anoAnterior = before.get(Calendar.YEAR);

			int parc = isBlank(qtd) ? 0 : Integer.parseInt(qtd);

			double saldoAnterior = lancamentoService.getReceitaTotal(mesAnterior, anoAnterior) - 
					lancamentoService.getDespesaTotal(mesAnterior, anoAnterior);

			SimulacaoData data = new SimulacaoData();

			double receita = lancamentoService.getReceitaTotal(0, ano);
			double simulacao = isBlank(valueStr) ? 0.0d : Double.parseDouble(valueStr);
			double despesa = lancamentoService.getDespesaTotal(0, ano);
			double despesaComSimulacao = 0.0;
			
			double saldo = receita + saldoAnterior - despesa;
			if(mes == 0){
				saldo -= simulacao;
				despesaComSimulacao = despesa + simulacao;
				data.valorIncluido = formatterUtil.getCurrencyString(simulacao);
				data.despesaComSimulacao = formatterUtil.getCurrencyString(despesaComSimulacao);
				parc--;
			}else{
				data.valorIncluido = formatterUtil.getCurrencyString(0.0d);
				data.despesaComSimulacao = formatterUtil.getCurrencyString(0.0d);
			}

			data.saldoAnterior = formatterUtil.getCurrencyString(saldoAnterior);
			data.receita = formatterUtil.getCurrencyString(receita);
			data.despesa = formatterUtil.getCurrencyString(despesa);
			

			data.saldo = formatterUtil.getCurrencyString(saldo);
			simulacaoDataList.add(data);

			for(int i = 1; i < 12; i++){

				data = new SimulacaoData();

				saldoAnterior = saldo;
				receita = lancamentoService.getReceitaTotal(i, ano);
				despesa = lancamentoService.getDespesaTotal(i, ano);
				saldo = saldoAnterior + receita - despesa;

				if(i >= mes && parc > 0){
					saldo -= simulacao;
					despesaComSimulacao = despesa + simulacao;
					parc--;
					data.valorIncluido = formatterUtil.getCurrencyString(simulacao);
					data.despesaComSimulacao = formatterUtil.getCurrencyString(despesaComSimulacao);
				}else{
					data.valorIncluido = formatterUtil.getCurrencyString(0.0d);
					data.despesaComSimulacao = formatterUtil.getCurrencyString(0.0d);
				}

				data.saldoAnterior = formatterUtil.getCurrencyString(saldoAnterior);
				data.receita = formatterUtil.getCurrencyString(receita);
				data.despesa = formatterUtil.getCurrencyString(despesa);
				
				data.saldo = formatterUtil.getCurrencyString(saldo);
				simulacaoDataList.add(data);

			}

			return simulacaoDataList;

		}else{

			throw new StatizoException(errors);

		}

	}


	public String[] getAnos(){
		return periodoService.getYearNames();
	}

}
